import axios from 'axios'
import store from '../store/index'
import router from '../router/auth'
// 创建axios的实例，配置
// 1.基地址
const request = axios.create({
  baseURL: 'http://localhost:8000'
})

// 请求拦截错误
request.interceptors.request.use(function (config) {
  // 如何取出vuex中保存的数据
  // $store.state.tokenInfo.token
  console.log('如何取出vuex中保存的数据', store)
  const token = store.state.tokenInfo.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  console.log('config请求拦截器2', config)
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  return response
}, async function (error) {
  // 如果发生了错误，判断是否是401
  console.dir(error)
  // 开始处理
  if (error.response.status === 401) {
    const refreshToken = store.state.tokenInfo.refresh_token
    if (refreshToken) {
      try {
        const res = await axios({
          method: 'PUT',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        const newToken = res.data.data.token
        // 把新token保存到vuex
        console.log('5. 把新token保存到vuex')
        store.commit('msetToken', {
          token: newToken, // 变化了
          refresh_token: refreshToken // 没有变化
        })
        // request重发请求，它会自动去vuex中带上最新的token(没过期的，新的)
        return request(error.config)
      } catch (err) {
        // 1. 清空token
        store.commit('msetToken', {})
        // 2. 回去登陆
        router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
        // 3. 返回错误信息
        return Promise.reject(new Error('请求新token失败'))
      }
    } else {
      // 1. 清空token
      store.commit('msetToken', {})
      // 2. 回去登陆, 带上要返回的地址
      router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
      // 3. 返回错误信息
      return Promise.reject(new Error('refresh_token不存在'))
    }
  }
  return Promise.reject(error)
})
// 导出
export default request
